package br.edu.ufc.deti.beans;

import br.edu.ufc.deti.util.Sigmoid;

public class Recurso implements Comparable<Object>{
	private String ipRecurso;
	private String nomeRecurso;
	private String hostRecurso;

	private Double valorNota;	
	private Float valorMemoria;
	private Float valorProcessador;
	private Float valorRedeInterna;
	private Float valorRedeExterna;

	private Double precoRecurso;
	private Float precoMemoria;
	private Float precoProcessador;
	private Float precoRedeInterna;
	private Float precoRedeExterna;
	
	public String getIpRecurso() {
		return ipRecurso;
	}
	public void setIpRecurso(String ipRecurso) {
		this.ipRecurso = ipRecurso;
	}
	public String getNomeRecurso() {
		return nomeRecurso;
	}
	public void setNomeRecurso(String nomeRecurso) {
		this.nomeRecurso = nomeRecurso;
	}
	public String getHostRecurso() {
		return hostRecurso;
	}
	public void setHostRecurso(String hostRecurso) {
		this.hostRecurso = hostRecurso;
	}	
	public Float getValorMemoria() {
		return valorMemoria;
	}
	public void setValorMemoria(Float valorMemoria) {
		this.valorMemoria = valorMemoria;
	}
	public Float getValorProcessador() {
		return valorProcessador;
	}
	public void setValorProcessador(Float valorProcessador) {
		this.valorProcessador = valorProcessador;
	}
	public Float getValorRedeInterna() {
		return valorRedeInterna;
	}
	public void setValorRedeInterna(Float valorRedeInterna) {
		this.valorRedeInterna = valorRedeInterna;
	}
	public Float getValorRedeExterna() {
		return valorRedeExterna;
	}
	public void setValorRedeExterna(Float valorRedeExterna) {
		this.valorRedeExterna = valorRedeExterna;
	}
	public Double getValorNota() {
		return valorNota;
	}
	public void setValorNota(Float pesoMemoria, Float pesoProc, Float pesoRedeInterna, Float pesoRedeExterna) {
		float parcelaMem = pesoMemoria.floatValue()*valorMemoria.floatValue();
		float parcelaProc = pesoProc.floatValue()*valorProcessador.floatValue();
		float parcelaRedeInterna = pesoRedeInterna.floatValue()*valorRedeInterna.floatValue();
		float parcelaRedeExterna = pesoRedeExterna.floatValue()*valorRedeExterna.floatValue();
		float somaPesos = pesoMemoria.floatValue()+pesoProc.floatValue()+
							pesoRedeInterna.floatValue()+pesoRedeExterna.floatValue();
		Double valorNotaSidmoid = new Double((parcelaRedeExterna+parcelaRedeInterna+parcelaMem+parcelaProc)/somaPesos);
		valorNota = Sigmoid.sigmoid( valorNotaSidmoid );
	}
	public Float getPrecoMemoria() {
		return precoMemoria;
	}
	public void setPrecoMemoria(Float precoMemoria) {
		this.precoMemoria = precoMemoria;
	}
	public Float getPrecoProcessador() {
		return precoProcessador;
	}
	public void setPrecoProcessador(Float precoProcessador) {
		this.precoProcessador = precoProcessador;
	}
	public Float getPrecoRedeInterna() {
		return precoRedeInterna;
	}
	public void setPrecoRedeInterna(Float precoRedeInterna) {
		this.precoRedeInterna = precoRedeInterna;
	}
	public Float getPrecoRedeExterna() {
		return precoRedeExterna;
	}
	public void setPrecoRedeExterna(Float precoRedeExterna) {
		this.precoRedeExterna = precoRedeExterna;
	}
	public Double getPrecoRecurso() {
		return precoRecurso;
	}
	public void setPrecoRecurso(Double precoRecurso) {
		this.precoRecurso = precoRecurso;
	}

    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Recurso)) {
            return false;
        }
        return ipRecurso.equals(((Recurso) obj).ipRecurso);
    }
    public int hashCode() {
        int hash = 5;
        hash = 29 * hash + (this.ipRecurso != null ? this.ipRecurso.hashCode() : 0);
        return hash;
    }
    public String toString() {
        return ipRecurso;
    }
	public int compareTo(Object o) {
	    //a comparação natural deve sempre lançar esta excepção e nunca deve tratar o elemento null
	    if (o == null) {
	        throw new NullPointerException();
	    }
	    Recurso obj = (Recurso) o;
	    return -valorNota.compareTo(obj.getValorNota());
	}
}
